package com.jvyou.common.utils;

import cn.dev33.satoken.stp.StpUtil;
import com.jvyou.common.constant.RedisKey;
import com.jvyou.common.core.domain.model.LoginUser;
import com.jvyou.common.enums.result.HttpCodeEnum;
import com.jvyou.common.exception.AppException;

import java.util.List;

/**
 * @author 橘柚
 * @since 2025/5/30 09:11
 */
public class SecurityUtils {

    /**
     * 获取当前登录用户ID
     *
     * @return 用户ID
     */
    public static Long getUserId() {
        if (!StpUtil.isLogin()) {
            throw new AppException(HttpCodeEnum.REQUIRE_TOKEN);
        }
        return Long.parseLong(StpUtil.getLoginId().toString());
    }


    /**
     * 判断是否登录
     *
     * @return 是否登录
     */
    public static boolean isLogin() {
        return StpUtil.isLogin();
    }

    /**
     * 获取当前登录用户Token
     *
     * @return token
     */
    public static String getToken() {
        if (!StpUtil.isLogin()) {
            throw new AppException(HttpCodeEnum.REQUIRE_TOKEN);
        }
        return StpUtil.getTokenValue();
    }

    /**
     * 获取当前登录用户信息
     *
     * @return 用户信息
     */
    public static LoginUser getLoginUser() {
        if (!StpUtil.isLogin()) {
            throw new AppException(HttpCodeEnum.REQUIRE_TOKEN);
        }
        return (LoginUser) StpUtil.getSession().get(RedisKey.LOGIN_USER_KEY + StpUtil.getLoginId());
    }

    /**
     * 获取当前登录用户的类型
     *
     * @return 用户ID
     */
    public static String getUserType() {
        if (!StpUtil.isLogin()) {
            throw new AppException(HttpCodeEnum.REQUIRE_TOKEN);
        }
        return getLoginUser().getType();
    }

    /**
     * 获取当前登录用户权限
     *
     * @return 权限
     */
    public static List<String> getPermissions() {
        if (!StpUtil.isLogin()) {
            throw new AppException(HttpCodeEnum.REQUIRE_TOKEN);
        }
        return StpUtil.getPermissionList();
    }

    /**
     * 获取当前登录用户角色
     *
     * @return 角色
     */
    public static List<String> getRoles() {
        if (!StpUtil.isLogin()) {
            throw new AppException(HttpCodeEnum.REQUIRE_TOKEN);
        }
        return StpUtil.getRoleList();
    }

    /**
     * 获取当前登录用户ID
     *
     * @return 用户ID
     */
    public static Boolean isAdmin() {
        if (!StpUtil.isLogin()) {
            return false;
        }
        return !getRoles().isEmpty() && getRoles().contains("admin");
    }
}
